home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / PIL / JpegImagePlugin.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  12KB  |  359 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. __version__ = '0.5'
  5. import array
  6. import string
  7. import Image
  8. import ImageFile
  9.  
  10. def i16(c, o = 0):
  11.     return ord(c[o + 1]) + (ord(c[o]) << 8)
  12.  
  13.  
  14. def i32(c, o = 0):
  15.     return ord(c[o + 3]) + (ord(c[o + 2]) << 8) + (ord(c[o + 1]) << 16) + (ord(c[o]) << 24)
  16.  
  17.  
  18. def Skip(self, marker):
  19.     n = i16(self.fp.read(2)) - 2
  20.     ImageFile._safe_read(self.fp, n)
  21.  
  22.  
  23. def APP(self, marker):
  24.     n = i16(self.fp.read(2)) - 2
  25.     s = ImageFile._safe_read(self.fp, n)
  26.     app = 'APP%d' % (marker & 15)
  27.     self.app[app] = s
  28.     self.applist.append((app, s))
  29.     if marker == 65504 and s[:4] == 'JFIF':
  30.         self.info['jfif'] = version = i16(s, 5)
  31.         self.info['jfif_version'] = divmod(version, 256)
  32.         
  33.         try:
  34.             jfif_unit = ord(s[7])
  35.             jfif_density = (i16(s, 8), i16(s, 10))
  36.         except:
  37.             pass
  38.  
  39.         if jfif_unit == 1:
  40.             self.info['dpi'] = jfif_density
  41.         
  42.         self.info['jfif_unit'] = jfif_unit
  43.         self.info['jfif_density'] = jfif_density
  44.     elif marker == 65505 and s[:5] == 'Exif\x00':
  45.         self.info['exif'] = s
  46.     elif marker == 65506 and s[:5] == 'FPXR\x00':
  47.         self.info['flashpix'] = s
  48.     elif marker == 65518 and s[:5] == 'Adobe':
  49.         self.info['adobe'] = i16(s, 5)
  50.         
  51.         try:
  52.             adobe_transform = ord(s[1])
  53.         except:
  54.             pass
  55.  
  56.         self.info['adobe_transform'] = adobe_transform
  57.     
  58.  
  59.  
  60. def COM(self, marker):
  61.     n = i16(self.fp.read(2)) - 2
  62.     s = ImageFile._safe_read(self.fp, n)
  63.     self.app['COM'] = s
  64.     self.applist.append(('COM', s))
  65.  
  66.  
  67. def SOF(self, marker):
  68.     n = i16(self.fp.read(2)) - 2
  69.     s = ImageFile._safe_read(self.fp, n)
  70.     self.size = (i16(s[3:]), i16(s[1:]))
  71.     self.bits = ord(s[0])
  72.     if self.bits != 8:
  73.         raise SyntaxError('cannot handle %d-bit layers' % self.bits)
  74.     
  75.     self.layers = ord(s[5])
  76.     if self.layers == 1:
  77.         self.mode = 'L'
  78.     elif self.layers == 3:
  79.         self.mode = 'RGB'
  80.     elif self.layers == 4:
  81.         self.mode = 'CMYK'
  82.     else:
  83.         raise SyntaxError('cannot handle %d-layer images' % self.layers)
  84.     if marker in (65474, 65478, 65482, 65486):
  85.         self.info['progression'] = 1
  86.     
  87.     for i in range(6, len(s), 3):
  88.         t = s[i:i + 3]
  89.         self.layer.append((t[0], ord(t[1]) / 16, ord(t[1]) & 15, ord(t[2])))
  90.     
  91.  
  92.  
  93. def DQT(self, marker):
  94.     n = i16(self.fp.read(2)) - 2
  95.     s = ImageFile._safe_read(self.fp, n)
  96.     while len(s):
  97.         if len(s) < 65:
  98.             raise SyntaxError('bad quantization table marker')
  99.         
  100.         v = ord(s[0])
  101.         if v / 16 == 0:
  102.             self.quantization[v & 15] = array.array('b', s[1:65])
  103.             s = s[65:]
  104.             continue
  105.         return None
  106.  
  107. MARKER = {
  108.     65472: ('SOF0', 'Baseline DCT', SOF),
  109.     65473: ('SOF1', 'Extended Sequential DCT', SOF),
  110.     65474: ('SOF2', 'Progressive DCT', SOF),
  111.     65475: ('SOF3', 'Spatial lossless', SOF),
  112.     65476: ('DHT', 'Define Huffman table', Skip),
  113.     65477: ('SOF5', 'Differential sequential DCT', SOF),
  114.     65478: ('SOF6', 'Differential progressive DCT', SOF),
  115.     65479: ('SOF7', 'Differential spatial', SOF),
  116.     65480: ('JPG', 'Extension', None),
  117.     65481: ('SOF9', 'Extended sequential DCT (AC)', SOF),
  118.     65482: ('SOF10', 'Progressive DCT (AC)', SOF),
  119.     65483: ('SOF11', 'Spatial lossless DCT (AC)', SOF),
  120.     65484: ('DAC', 'Define arithmetic coding conditioning', Skip),
  121.     65485: ('SOF13', 'Differential sequential DCT (AC)', SOF),
  122.     65486: ('SOF14', 'Differential progressive DCT (AC)', SOF),
  123.     65487: ('SOF15', 'Differential spatial (AC)', SOF),
  124.     65488: ('RST0', 'Restart 0', None),
  125.     65489: ('RST1', 'Restart 1', None),
  126.     65490: ('RST2', 'Restart 2', None),
  127.     65491: ('RST3', 'Restart 3', None),
  128.     65492: ('RST4', 'Restart 4', None),
  129.     65493: ('RST5', 'Restart 5', None),
  130.     65494: ('RST6', 'Restart 6', None),
  131.     65495: ('RST7', 'Restart 7', None),
  132.     65496: ('SOI', 'Start of image', None),
  133.     65497: ('EOI', 'End of image', None),
  134.     65498: ('SOS', 'Start of scan', Skip),
  135.     65499: ('DQT', 'Define quantization table', DQT),
  136.     65500: ('DNL', 'Define number of lines', Skip),
  137.     65501: ('DRI', 'Define restart interval', Skip),
  138.     65502: ('DHP', 'Define hierarchical progression', SOF),
  139.     65503: ('EXP', 'Expand reference component', Skip),
  140.     65504: ('APP0', 'Application segment 0', APP),
  141.     65505: ('APP1', 'Application segment 1', APP),
  142.     65506: ('APP2', 'Application segment 2', APP),
  143.     65507: ('APP3', 'Application segment 3', APP),
  144.     65508: ('APP4', 'Application segment 4', APP),
  145.     65509: ('APP5', 'Application segment 5', APP),
  146.     65510: ('APP6', 'Application segment 6', APP),
  147.     65511: ('APP7', 'Application segment 7', APP),
  148.     65512: ('APP8', 'Application segment 8', APP),
  149.     65513: ('APP9', 'Application segment 9', APP),
  150.     65514: ('APP10', 'Application segment 10', APP),
  151.     65515: ('APP11', 'Application segment 11', APP),
  152.     65516: ('APP12', 'Application segment 12', APP),
  153.     65517: ('APP13', 'Application segment 13', APP),
  154.     65518: ('APP14', 'Application segment 14', APP),
  155.     65519: ('APP15', 'Application segment 15', APP),
  156.     65520: ('JPG0', 'Extension 0', None),
  157.     65521: ('JPG1', 'Extension 1', None),
  158.     65522: ('JPG2', 'Extension 2', None),
  159.     65523: ('JPG3', 'Extension 3', None),
  160.     65524: ('JPG4', 'Extension 4', None),
  161.     65525: ('JPG5', 'Extension 5', None),
  162.     65526: ('JPG6', 'Extension 6', None),
  163.     65527: ('JPG7', 'Extension 7', None),
  164.     65528: ('JPG8', 'Extension 8', None),
  165.     65529: ('JPG9', 'Extension 9', None),
  166.     65530: ('JPG10', 'Extension 10', None),
  167.     65531: ('JPG11', 'Extension 11', None),
  168.     65532: ('JPG12', 'Extension 12', None),
  169.     65533: ('JPG13', 'Extension 13', None),
  170.     65534: ('COM', 'Comment', COM) }
  171.  
  172. def _accept(prefix):
  173.     return prefix[0] == '\xff'
  174.  
  175.  
  176. class JpegImageFile(ImageFile.ImageFile):
  177.     format = 'JPEG'
  178.     format_description = 'JPEG (ISO 10918)'
  179.     
  180.     def _open(self):
  181.         s = self.fp.read(1)
  182.         if ord(s[0]) != 255:
  183.             raise SyntaxError('not a JPEG file')
  184.         
  185.         self.bits = self.layers = 0
  186.         self.layer = []
  187.         self.huffman_dc = { }
  188.         self.huffman_ac = { }
  189.         self.quantization = { }
  190.         self.app = { }
  191.         self.applist = []
  192.         while None:
  193.             s = s + self.fp.read(1)
  194.             i = i16(s)
  195.             if MARKER.has_key(i):
  196.                 (name, description, handler) = MARKER[i]
  197.                 if handler is not None:
  198.                     handler(self, i)
  199.                 
  200.                 if i == 65498:
  201.                     rawmode = self.mode
  202.                     if self.mode == 'CMYK':
  203.                         rawmode = 'CMYK;I'
  204.                     
  205.                     self.tile = [
  206.                         ('jpeg', (0, 0) + self.size, 0, (rawmode, ''))]
  207.                     break
  208.                 
  209.                 s = self.fp.read(1)
  210.                 continue
  211.             if i == 0 or i == 65535:
  212.                 s = '\xff'
  213.                 continue
  214.             raise SyntaxError('no marker found')
  215.             continue
  216.             return None
  217.  
  218.     
  219.     def draft(self, mode, size):
  220.         if len(self.tile) != 1:
  221.             return None
  222.         
  223.         (d, e, o, a) = self.tile[0]
  224.         scale = 0
  225.         if a[0] == 'RGB' and mode in ('L', 'YCbCr'):
  226.             self.mode = mode
  227.             a = (mode, '')
  228.         
  229.         if size:
  230.             scale = max(self.size[0] / size[0], self.size[1] / size[1])
  231.             for s in [
  232.                 8,
  233.                 4,
  234.                 2,
  235.                 1]:
  236.                 if scale >= s:
  237.                     break
  238.                     continue
  239.             
  240.             e = (e[0], e[1], ((e[2] - e[0]) + s - 1) / s + e[0], ((e[3] - e[1]) + s - 1) / s + e[1])
  241.             self.size = ((self.size[0] + s - 1) / s, (self.size[1] + s - 1) / s)
  242.             scale = s
  243.         
  244.         self.tile = [
  245.             (d, e, o, a)]
  246.         self.decoderconfig = (scale, 1)
  247.         return self
  248.  
  249.     
  250.     def load_djpeg(self):
  251.         import tempfile as tempfile
  252.         import os as os
  253.         file = tempfile.mktemp()
  254.         os.system('djpeg %s >%s' % (self.filename, file))
  255.         
  256.         try:
  257.             self.im = Image.core.open_ppm(file)
  258.         finally:
  259.             
  260.             try:
  261.                 os.unlink(file)
  262.             except:
  263.                 pass
  264.  
  265.  
  266.         self.mode = self.im.mode
  267.         self.size = self.im.size
  268.         self.tile = []
  269.  
  270.     
  271.     def _getexif(self):
  272.         import TiffImagePlugin as TiffImagePlugin
  273.         import StringIO as StringIO
  274.         
  275.         def fixup(value):
  276.             if len(value) == 1:
  277.                 return value[0]
  278.             
  279.             return value
  280.  
  281.         
  282.         try:
  283.             data = self.info['exif']
  284.         except KeyError:
  285.             return None
  286.  
  287.         file = StringIO.StringIO(data[6:])
  288.         head = file.read(8)
  289.         exif = { }
  290.         info = TiffImagePlugin.ImageFileDirectory(head)
  291.         info.load(file)
  292.         for key, value in info.items():
  293.             exif[key] = fixup(value)
  294.         
  295.         file.seek(exif[34665])
  296.         info = TiffImagePlugin.ImageFileDirectory(head)
  297.         info.load(file)
  298.         for key, value in info.items():
  299.             exif[key] = fixup(value)
  300.         
  301.         
  302.         try:
  303.             file.seek(exif[34853])
  304.         except KeyError:
  305.             pass
  306.  
  307.         info = TiffImagePlugin.ImageFileDirectory(head)
  308.         info.load(file)
  309.         exif[34853] = gps = { }
  310.         for key, value in info.items():
  311.             gps[key] = fixup(value)
  312.         
  313.         return exif
  314.  
  315.  
  316. RAWMODE = {
  317.     '1': 'L',
  318.     'L': 'L',
  319.     'RGB': 'RGB',
  320.     'RGBA': 'RGB',
  321.     'RGBX': 'RGB',
  322.     'CMYK': 'CMYK;I',
  323.     'YCbCr': 'YCbCr' }
  324.  
  325. def _save(im, fp, filename):
  326.     
  327.     try:
  328.         rawmode = RAWMODE[im.mode]
  329.     except KeyError:
  330.         raise IOError('cannot write mode %s as JPEG' % im.mode)
  331.  
  332.     info = im.encoderinfo
  333.     dpi = info.get('dpi', (0, 0))
  334.     if not info.has_key('progressive'):
  335.         pass
  336.     im.encoderconfig = (info.get('quality', 0), info.has_key('progression'), info.get('smooth', 0), info.has_key('optimize'), info.get('streamtype', 0), dpi[0], dpi[1])
  337.     ImageFile._save(im, fp, [
  338.         ('jpeg', (0, 0) + im.size, 0, rawmode)])
  339.  
  340.  
  341. def _save_cjpeg(im, fp, filename):
  342.     import os
  343.     file = im._dump()
  344.     os.system('cjpeg %s >%s' % (file, filename))
  345.     
  346.     try:
  347.         os.unlink(file)
  348.     except:
  349.         pass
  350.  
  351.  
  352. Image.register_open('JPEG', JpegImageFile, _accept)
  353. Image.register_save('JPEG', _save)
  354. Image.register_extension('JPEG', '.jfif')
  355. Image.register_extension('JPEG', '.jpe')
  356. Image.register_extension('JPEG', '.jpg')
  357. Image.register_extension('JPEG', '.jpeg')
  358. Image.register_mime('JPEG', 'image/jpeg')
  359.